|
Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. However, insertion sort provides several advantages: * Simple implementation: Bentley shows a three-line C version, and a five-line optimized version * Efficient for (quite) small data sets, much like other quadratic sorting algorithms * More efficient in practice than most other simple quadratic (i.e., O(''n''2)) algorithms such as selection sort or bubble sort * Adaptive, i.e., efficient for data sets that are already substantially sorted: the time complexity is when each element in the input is no more than places away from its sorted position * Stable; i.e., does not change the relative order of elements with equal keys * In-place; i.e., only requires a constant amount O(1) of additional memory space * Online; i.e., can sort a list as it receives it When people manually sort cards in a bridge hand, most use a method that is similar to insertion sort.〔.〕 ==Algorithm== Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain. Sorting is typically done in-place, by iterating up the array, growing the sorted list behind it. At each array-position, it checks the value there against the largest value in the sorted list (which happens to be next to it, in the previous array-position checked). If larger, it leaves the element in place and moves to the next. If smaller, it finds the correct position within the sorted list, shifts all the larger values up to make a space, and inserts into that correct position. The resulting array after ''k'' iterations has the property where the first ''k'' + 1 entries are sorted ("+1" because the first entry is skipped). In each iteration the first remaining entry of the input is removed, and inserted into the result at the correct position, thus extending the result: becomes with each element greater than ''x'' copied to the right as it is compared against ''x''. The most common variant of insertion sort, which operates on arrays, can be described as follows: # Suppose there exists a function called ''Insert'' designed to insert a value into a sorted sequence at the beginning of an array. It operates by beginning at the end of the sequence and shifting each element one place to the right until a suitable position is found for the new element. The function has the side effect of overwriting the value stored immediately after the sorted sequence in the array. # To perform an insertion sort, begin at the left-most element of the array and invoke ''Insert'' to insert each element encountered into its correct position. The ordered sequence into which the element is inserted is stored at the beginning of the array in the set of indices already examined. Each insertion overwrites a single value: the value being inserted. Pseudocode of the complete algorithm follows, where the arrays are zero-based: for i ← 1 to length(A) - 1 j ← i while j > 0 and A() > A() swap A() and A() j ← j - 1 end while end for The outer loop runs over all the elements except the first one, because the single-element prefix A() is trivially sorted, so the invariant that the first i+1 entries are sorted is true from the start. The inner loop moves element A() to its correct place so that after the loop, the first i+2 elements are sorted.After expanding the "swap" operation in-place as t ← A(); A() ← A(); A() ← t (where t is a temporary variable), a slightly faster version can be produced that moves A() to its position in one go and only performs one assignment in the inner loop body:〔for i = 1 to length(A) - 1 x = A() j = i while j > 0 and A() > x A() = A() j = j - 1 end while A() = x〔 Section 2.1: Insertion sort, pp. 15–21. See in particular p. 17.〕 end for The new inner loop shifts elements to the right to clear a spot for x = A() .Note that although the common practice is to implement in-place, which requires checking the elements in-order, the order of checking (and removing) input elements is actually arbitrary. The choice can be made using almost any pattern, as long as all input elements are eventually checked (and removed from the input). 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「insertion sort」の詳細全文を読む スポンサード リンク
|